/* eslint-disable consistent-this */
/* eslint-disable func-style */
import Vue from 'vue';
import _ from 'lodash';

const postGen = async function (self, type) {
  const { pageNo, pageSize, params } = self;
  const mergeParams = Object.assign({}, { pageNo, pageSize }, params);
  self.loading = true;
  console.log(Vue.get);
  return Vue.get(Vue.paramsConnect(self.url, mergeParams))
    .then((res)=> {
      // 解构复制并设置默认值
      const { list: data = [], total } = res.data.data;
      self.total = total;
      self.totalPage = Math.ceil(total / pageSize);

      if (type === 'ADD') {
        self.rows.push(...data);
      } else {
        self.rows = data;
      }
      if (pageSize * pageNo >= total) {
        self.hasMore = false;
      } else {
        self.hasMore = true;
      }
      return res;
    })
    .finally(()=> {
      self.loading = false;
    });
};

export default class PagedList {
  constructor(url, pageSize = 10) {
    this.url = url;
    this.pageSize = pageSize;
    this.loading = false;
    // 当前页
    this.pageNo = 1;
    // 符合条件的数据总数
    this.total = 0;
    // 符合条件的数据总页数
    this.totalPage = 0;
    // 加载过来的数据
    this.rows = [];
    // 是否还有更多数据
    this.hasMore = true;
    // 条件
    this.params = {};
  }
  /**
  * 查询
  *
  * @param {*} condition 需要额外传入的条件
  * @return {Promise}
  */
  search(params = {}) {
    // 如果条件发生变化，则自动返回第一页
    if (!_.isEqual(this.params, params)) {
      this.params = params;
      this.pageNo = 1;
    }
    return postGen(this);
  }
  /**
  * 加载更多，新查询的数据会添加到原有的数组中而不是替代
  *
  * @return {Promise}
  */
  addLoad() {
    this.pageNo += 1;
    return postGen(this, 'ADD');
  }
  /**
  * 加载下一页或指定页码
  *
  * @param {Number} pageNo 页码，不指定时自动查询下一页
  * @return {Promise}
  */
  pageLoad(pageNo) {
    this.pageNo = pageNo || this.pageNo + 1;
    return postGen(this);
  }
  /**
  * 一页加载数据量变动重新加载数据
  *
  * @param {Number} size 一页加载数据量
  * @return {Promise}
  */
  changePageSize(size) {
    const { total, pageNo } = this;
    this.pageNo = Math.min(pageNo, Math.ceil(total / size));
    this.pageSize = size;
    return postGen(this);
  }
  /**
  * 刷新，删除修改等操作后需要刷新数据,不用传递任何参数
  *
  * @return {Promise}
  */
  refresh() {
    return postGen(this);
  }
  // 取消查询
}
